XMS規格のEMBの占有状況を表示,EMBを確保/解放するプログラム

EMBCHK

3.50版 Copyright(C) 1993,2024まりも

0.このプログラムの目的

 XMS規格のメモリには次のものがあります。

このうちEMBはXMS規格メモリマネージャ(XMM)のファンクションによって、メモリ空間の確保、開放、ロックなどの管理をしながらアプリケーションが使用します。

 本プログラムは、EMBの割り当て状況を表示したり、ダミーのEMBを割り当てたり、割り当てを取り消したりすることができるツールです。NEC PC-9800シリーズのみならずPC/AT互換機でも使用できます。XMSの利用にあたってCPUは80386以上であることが望ましいですが、XMSの規格は80286以上で定義されており、本プログラムは80286でも動作します。

1.使用法1

 まずMS-DOSでは HIMEM.SYSなどのXMMを config.sysに記述し、インストールしておいてください。MS-DOS純正のHIMEM.SYS 以外でも、仮想86EMSマネージャ単独でHIMEM.SYSと同等の機能を提供するものがあります。PC-98版ではVMM386,VEM486,LEMMなどです。それらも使用可能です。

 コマンドラインから EMBCHK と打って実行します。コマンドラインオプション無しの場合、 EMBの占有状況を表示します。下記では表示例と読み方について説明します。


 XMS(EMB) information.  V3.50  Copyright(C) 1992,2024 DOSsoft   EMB使用状況 
XMM driver version  2.60 , HMA is installed.  [386]  [REAL] 
EMB memory 16383 KB free(maximum),   17407 KB free(total).
EMB handle F72Ah --> base address 00110000h~ 960 KB     (000F0000h)
EMB handle F730h --> base address 00200000h~ 1024 KB    (00100000h)
EMB handle F73Ch --> base address 00400000h~ 12288 KB   (00C00000h)
EMB handle F742h --> base address 01000000h~ 32768 KB   (02000000h)

 まず XMM driver version が表示されます。MS-DOS 6.20以上では 3.xx のはずです。2.xx の場合は扱える最大メモリ容量などに機能的に制約があります。"HMA is installed." というのは XMMによってHMAが提供されている場合に現れます。config.sys で DOS=HIGHの指定があれば必ず表示されます。

 free(maximum) で表示されるのは1度のXMMファンクション手続きで確保できる最大の容量を示します。占有中のメモリブロックがなければ搭載メモリに等しいはずです。ただしXMM バージョン 3 未満の場合、約64MBだったり 約15MBだったりするかもしれません。 free(total) で表示されるほうは、複数回の手続きで確保できる合計の容量を示します。XMMのバージョンが古いと、搭載メモリより少なく表示されることがあります。

 EMBの管理は handle という一意の16bit値で行われます。base addressというのはEMB各ブロックの基底アドレスです。CPUがリアルモードで動作している場合は物理アドレスと等しいものになります。~ の後にブロックの占有サイズが十進数で示されます。後続の()内はそのバイト単位の十六進数表記です。

2.使用法2

 コマンドラインを指定することによりEMBの確保と開放が可能です。

【確保】

+ のあとにKB容量値を十進数で記述すると、その容量を確保します。例えば +512 とすると、


 XMS(EMB) information.  V3.50  Copyright(C) 1992,2024 DOSsoft  EMBを確保します 
XMM driver version  2.60 , HMA is installed.  [386]  [REAL] 
Allocation size = 512 KB 
EMB memory 16383 KB free(maximum),   16895 KB free(total).
EMB handle F72Ah --> base address 00110000h~ 960 KB     (000F0000h)
EMB handle F730h --> base address 00200000h~ 1024 KB    (00100000h)
EMB handle F736h --> base address 00300000h~ 512 KB     (00080000h)
EMB handle F73Ch --> base address 00400000h~ 12288 KB   (00C00000h)
EMB handle F742h --> base address 01000000h~ 32768 KB   (02000000h)

このように新たにハンドル F736h が割り当てられ、空いていた 300000hから 512KBの領域が確保されます。

【開放】

- のあとにハンドル値を十六進数で記述すると、そハンドルが管理するブロックのメモリを開放します。ハンドルも消滅します。例えば上記のときに -F742 とすると


 XMS(EMB) information.  V3.50  Copyright(C) 1992,2024 DOSsoft  EMBを解放します 
XMM driver version  2.60 , HMA is installed.  [386]  [REAL] 
EMB handle F742h was purged.
EMB memory 49151 KB free(maximum),   49663 KB free(total).
EMB handle F72Ah --> base address 00110000h~ 960 KB     (000F0000h)
EMB handle F730h --> base address 00200000h~ 1024 KB    (00100000h)
EMB handle F736h --> base address 00300000h~ 512 KB     (00080000h)
EMB handle F73Ch --> base address 00400000h~ 12288 KB   (00C00000h)

のように handle F742h が占有していた 32768KBのエリアが開放され、free の大きさがそのぶん増えます。

 確保や開放をしただけでは、システムになんの影響も与えません。実際にそこに あるメモリを使うためには、アプリケーション内でXMS の確保ファンクションを 実行し、そこで得たハンドルを使ってアドレスと範囲を把握し、それにより プロテクトモードでメモリアクセスを行う必要があります。XMMにはファンクション 0Bhというメモリ転送機能があるので、DOSアプリケーションでは一般的にこれを 利用して1MB以内の空間とEMBとの間でデータの移動を行いながら使います。

 なお全くEMBの割当がない場合でも free(maximum) と free(total) の異なる 値が表示される理由は、15-16MBシステム空間による分断が原因です。例


 XMS(EMB) information.  V3.50  Copyright(C) 1992,2024 DOSsoft   EMB使用状況 
XMM driver version  3.5F , HMA is installed.  [386]  [REAL]  [EXfunc] 
EMB memory 131072 KB free(maximum),   145344 KB free(total).
No active EMB handles.

 一般に、確保と開放を繰り返した場合、中程に占有域があれば分断化は普通に起こり えます。

【テスト】

  * のあとにハンドルの値十六進数で記述すると、そのハンドルが管理するブロックのメモリに値E5hを書き込んで埋めます。その後読み出します。データが一致しない場合は " Test failure!" というメッセージが出て終了します。成功した場合は次のような表示となります。


EMBCHK *54A8
 XMS(EMB) information.  V3.50  Copyright(C) 1992,2024 DOSsoft  EMBをチェックします 
XMM driver version  3.5F , HMA is installed.  [386]  [REAL]  [EXfunc] 
EMB memory 18432 KB free(maximum),   30720 KB free(total).
EMB handle 548Ah --> base address 00110000h~ 960 KB     (000F0000h)
EMB handle 5494h --> base address 01000000h~ 14336 KB   (00E00000h)
EMB handle 549Eh --> base address 00200000h~ 1024 KB    (00100000h)
EMB handle 54A8h --> base address 01E00000h~ 98304 KB   (06000000h)
EMB handle 54A8h  Checking memory 01E00000h - 07DFFFFFh  OK.

 この機能は、既に使用しているEMBのブロックには絶対に適用してはいけません。 本ツールで新規に割り当てたEMBハンドルだけを対象としてください。例えばSMARTDRVが既に使用しているEMBブロックに対して実施すると、ディスクのデータが壊滅的に破壊されるといったことが起こります。自己責任でお試し下さい。

 コマンドラインオプション文字列が "+" か "-" か "*" で始まるものでない場合は全て無視され、EMB割当状態の表示のみとなります。警告は出されません。なお "?" で始まる文字列を指定した場合は、使用法が表示されます。

3.注意点

 80286機ではCPU自体が遅いことに加え、リアルモードとプロテクトモードの間を行き来するXMMの動作が非常に遅いので、EMBハンドルを検索している時間が長くなります。これは搭載メモリ量には比例しません。数秒はかかると考えて下さい。EMB memory **** KB free(maximum) のあとハングアップしたかのようになります。

 V30/8086機ではまったく動作せずエラーで終了します。HIMEM.SYSなどのXMMドライバがない環境でもエラーで終了します。

 MS-DOS バージョン3.30未満では実行できません。画面出力は標準出力に行っています。PC-98では色もついて表示されますが、色指定にはエスケープシーケンスを使用しておらず、DOS拡張ファンクション int DChを使用しています。これはMS-DOSバージョン3.30以上,FreeDOS(98)でサポートされています。標準出力をリダイレクトしたものには色を指定するコードのようなものは付きません。プレインテキストです。

 仮想86モードではEMBのベースアドレスは実アドレスである保証がありません。 というよりほとんどの場合実アドレスではありません。

 PC/ATで実行した場合、文字に色はつきません。日本語DOS/Vと判定される場合は 一部日本語表示が行われます。英語モードの場合は英語です。

4.技術的補足

 XMSの規格は80286が登場してしばらく後に制定されました。概ねXMS 2.0というバージョンになります。このバージョンでは各EMMファンクションは16bitの単位で行われており、指定できるメモリの容量の最大はどうやっても 15MB以内です。

 80386が登場するとメモリ空間は16MBを超えるようになります。16itでキロバイト単位のメモリサイズを指定すると最大65535KB(約64MB)まで可能です。しかし1990年後半からはもっとメモリを搭載できる機種が現れたことから、XMMは拡張の必要が生じました。そこで XMS バージョン 3.xxの規格からは 32bitで指定できる「拡張ファンクション」が追加されました。これにより一回で65536以上のメモリを確保したり、合計の空き容量が 65536MB以上であっても正しく取得できるようになりました。

 なおXMS 3の拡張ファンクションは、Microsoft/NEC/IBM純正以外のXMMドライバでは意外にもほとんどサポートされていないようです。

 XMMのファンクションでは、サイズ 0の確保を行うとサイズ 0でハンドルが割当られるのが仕様のようです。しかしそのハンドルに存在意義はないと考えられるため、本プログラムでは、サイズが0の場合は確保ファンクションの実行自体を回避します。

 黄色文字で示される次の表示は動作モードを示し、以下のようなことを意味します。
[286] CPUが80286である
[386] CPUが80386以上である
[REAL] リアルモードである
[V86] 仮想86モードである(EMM386など実行下)
[EXfunc] XMS 3 拡張ファンクションが装備されている
[PC/AT] PC-9800シリーズでない

 PC/AT互換機(uEFIでないBIOS搭載機)では例えば次のようになります。BIOS起動後にリアルモードで見えている4GB空間のRAMは、ACPIでの利用など、システムにより相当に分断化がなされています。EMBもその分断境界を跨ぐことができません。maximumに現れる値で逐次確保して行くとこのように割り当てられます。最大のブロックは 2316MBとなっています。4GBを超えて物理メモリを実装していても、DOS 7.1 時代のHIMEM.SYS は対応しきれません。ただし本体BIOSの新しいint 15hファンクションで4GBを超えるメモリの使用状況を取得できます。詳しくは拙作 「mempap」をお試しになるかその説明書をご覧下さい。


 XMS(EMB) information.  V3.50  Copyright(C) 1992,2024 DOSsoft  EMB使用状況 
XMM driver version  3.5F , HMA is installed.   [386] [PC/AT] [REAL] [EX-func] 
EMB memory 56 KB free(maximum),   60 KB free(total).
EMB handle E58Eh --> base address 00110000h~ 331 KB     (00052C00h)
EMB handle E598h --> base address 20200000h~ 522256 KB  (1FE04000h)
EMB handle E5A2h --> base address 40005000h~ 2316220 KB         (8D5EF000h)
EMB handle E5ACh --> base address CDE0F000h~ 580 KB     (00091000h)
EMB handle E5C0h --> base address CE59A000h~ 7908 KB    (007B9000h)
EMB handle E5D4h --> base address 00162C00h~ 522869 KB  (1FE9D400h)

 ソースファイルも添付されています。source.zip というアーカイブファイルです。 XMS.S というファイルをアセンブル、リンクするとCOM形式の実行プログラムが得られ ます。それをEXE形式に変換するついでに名前を変えたものが EMBCHK.EXE です。

【旧バージョン】

 EMBCHK2.COM という旧バージョンのプログラムも添付されています。これはXMMの従来ファンクションしか使用していないので、実行結果は EMBCHK と異なる場合があります。65535KB以下の確保と開放については EMBCHK と同様の結果になります。65536KB 以上の指定はできず、0 からのラップアラウンドとなります。EMBの空き容量は65535KB を超えることはありません。

 【参考文献】(従来ファンクション)
 日本電気 1991
 MS-DOS 5.00 プログラマーズ リファレンスマニュアル Vol.2 第6章

5.免責事項

 このプログラムは「フリーソフト」ですが、著作権は作者にあります。著作権者の意向を無視したことはしないでください。たとえば不特定多数がダウンロードできる場所への無断転載は禁止とします。

 このプログラムを使用した結果について、たとえば既に使用しているEMB領域を開放したりテストすることでディスクドライブのデータを破壊するような誤操作の損害などについて、作者は一切責任は負わないものとします。

 連絡先メールアドレスは、トップページに記載されています。

[同意の上ダウンロードする]

6.【改版履歴】


日付    版  内容
年 月 日  版   内容
1992年末   2.00  EMBハンドルの検索のみの機能のものを作成
1993-12-5 3.01    16MBを超える表示に対応、確保と開放機能を追加
2024-7-30 3.50  拡張ファンクションに対応, 80286機に対応
2024-8- 1 3.51  仮想86モード時の表示が誤っていたのを修正(機能的には無問題)

2024-8-1 まりも

[戻る]